package KnowSparkSQL.SQL.AnalyticalFunctions;

import org.apache.spark.sql.AnalysisException;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;

/**
 * 3.开窗函数
 * 什么是开窗函数？函数后面跟上over(xxxx) 结构，
 * 则可以将他们成为开窗函数（不要纠结这个说法）。那有什么作用？这个东西为啥会存在？
 * 我们知道，
 * 执行select institute, max(age) from student group by institute这个sql语句时，
 * select关键字后跟的要么是group by后面的字段，要么就是聚合函数，不能是别的字段，
 * 也就是经过分组操作，最终每组数据就聚合成一条数据了。如果既要按照学院字段分组求每个学院的最大年龄，又想显示所有行和所有字段怎么办？
 */
public class OpenWindowTest {
    public static void main(String[] args) throws AnalysisException {
        SparkSession sparkSession = SparkSession.builder().appName(OpenWindowTest.class.getName()).master("local").getOrCreate();

        Dataset<Row> json = sparkSession.read().json("./data/student.json");

        json.createTempView("stu");

        String sql = "select * ,dense_rank() over(partition by institute order by age desc, name asc) as rank_no from stu";

        sparkSession.sql(sql).show();
    }
}
